package com.sptpc.demo.support;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;

import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 用于Money类型和数据库类型（本例为BigDecimal）的转换
 * 使用：在Mybatis的mapper文件中通过typeHandler属性使用,
 *      注意result配置和inser，update语句都要使用
 */
public class MoneyHandler extends BaseTypeHandler<Money> {
    /*
    java->数据库
     */
    @Override
    public void setNonNullParameter(
            PreparedStatement preparedStatement, int colIndex, Money money, JdbcType jdbcType)
            throws SQLException {
        preparedStatement.setBigDecimal(colIndex, money.getAmount());
    }

    /*
    数据库->java
     */
    @Override
    public Money getNullableResult(ResultSet resultSet, String colName) throws SQLException {
        return parseMoney(resultSet.getBigDecimal(colName));
    }

    @Override
    public Money getNullableResult(ResultSet resultSet, int colIndex) throws SQLException {
        return parseMoney(resultSet.getBigDecimal(colIndex));
    }

    @Override
    public Money getNullableResult(CallableStatement callableStatement, int colIndex)
            throws SQLException {
        return parseMoney(callableStatement.getBigDecimal(colIndex));
    }

    /*
    将数据库中查出的BigDecimal类型转换为Money类型
     */
    private Money parseMoney(BigDecimal value) {
        return Money.of(CurrencyUnit.of("CNY"), value);
    }
}

